Bitmap Header Turorial
Погледнете първо следните пикове :)) 

Хубави са
нали :) Нека сега разучим тяхната структура.Погледнете пиковете още един път ,
че тази структура не е много лесна ;) Като за начало предполагам ви е
направило впечатление , че те са с разширение .bmp т.е те са Bitmap-и . Нека
сега ги отворим с някои HEX-Editor 
Преди всички имайте в предвит слдната структура
|
offset |
size |
description |
| 0 | 2 | трябва да бъде винаги 4D42 (в hex) |
| 2 | 4 | Размера на BitMap-а в байтове(не винаги) |
| 6 | 2 | Трябва да е 0(константа) |
| 8 | 2 | Трябва да е 0(константа) |
| 10 | 4 | Офсета където започва 'image data'(началото на на Декодирането на информацията) |
| 14 | 4 | Размера на BITMAPINFOHEADER структурата(трябва да е 28) |
| 18 | 4 | Дължината на образа в пиксели |
| 22 | 4 | Височината на образа в пиксели |
| 26 | 2 | Номера на плана на изображението(трябва да е 1) |
| 28 | 2 | Брой битове за пиксел (1,4,8,16 или 24) |
| 30 | 4 | Вид компресия(0=никаква, 1=RLE-8, 2=RLE-4) |
| 34 | 4 | Размера на 'image data' |
| 38 | 4 | Хоризонтална резолюция в пиксели на см. |
| 42 | 4 | Вертикална резолюция в пиксели на см. |
| 46 | 4 | Броя на цветовете в изображението или направо 0 |
| 50 | 4 | Броя на важните цветове или направо 0 |
Нека сега да започнем с анализа на снимката.Първите 2 байта са
ясни(424D=BM),защото са задължителни.Следващите 4 са за размера , но те никога
не се взимат под внимание и в повечето случеи са случайни числа , така че няма
смисъл да ги анализираме.После на офсет 6 и 8 имаме пак по 2 байта които винаги
трябва да са нули и са константи.После на офсет 10 е записан адреса за началото
на 'image data'.image data е тази част на битмапа , която се превръща от HEX в
отделни пиксели.В случея писше
.това означава че от
този офсет(36) всеки символ се преобразува в някакъв цвят.След това на офсет 14
имаме 4 байта които са константни(28).Следващите 4 байта от офсет 18 и ни
показват колко пиксела е дължината на образа(B4 в decimal е 180).Следващите 4
байта ни показват колко пиксела е височината на образа(2C01 в decimal е
11265).Стигнахме до офсет 26 и 27.Те показват плана на изображението , но в
повечето случеи се приемат за константи т.е. просто 0100h.Един от най важните
(поне според мене) е офсет 28.От него се взема колко байта да отговарят на един
пиксел.Или казано иначе колкото по малко байтове се използват за един пиксел ,
толкова по малко са съответно съзможните цветове.Възможностите са 1,4,8,16 или
24 бита за пиксел в цветове ще рече съответно:
| Бита за пиксел | Брой цветове |
| 1 | 2 цвята |
| 2 | 4 цвята |
| 4 | 16 цвята |
| 8 (байт) | 256 цвята |
| 16(2 байта) | 65536 цвята |
| 24(3 байта) | 16777216 цвята |
В случея на нашия пик всеки пиксел е по 2 байта.Затова и пика е толкова
реалистичен.Байтовете от офсет 30 до офсет 34 са предвидени за комресия на
битмапа , но до до сега не съм виждал програма която да използва или подържа
тази комресия,затова се мриема , че те са константи (00000000)
Байтовете от
офсет 34 до офсет 38 са предвидени за размера на 'image data' или казани
иначе докъде ще бъде преобразуването от HEX в нормални цветове.Колкото им е
SignedLong-а на тези 4 байта , толкова ще бъдат трансформираните байтове в
цветове.В случея имаме D0780200 и това ще е равно на 162000 =>от 'image data'
ще бъдат прочетени 162000 бита.След това на офсет 38 идват 4 байта които
показват каква ще бъде хоризонталната резолюция в пиксели на сантиметар.След тях
има още 4 байта които ни показват вертикалната резолюция в пиксели на
сантиметар.Байтовете от офсет 46 до офсет 50 са предвидени за броя на
цветовете в изображението, но почти винаги се слага това не се използва по
предназначение и се поставя направо 00000000.Следващите 4 байта са предназначени
за по важните цветове в изображението , но пак това се пренебрегва и повечето
програми слагат 00000000.